package main

import (
	"errors"
	"fmt"
	"os"
)

//单数组队列
type Queue struct {
	maxSize int    //数组的最大的容量
	array   [5]int //实际数组
	head    int    //队首的位置 默认为: -1
	end     int    //队尾的位置 默认为: -1
}

//添加数据到队列中
func (this *Queue) Add(val int) (error) {
	if this.end == (this.maxSize - 1) {
		//说明队尾的位置在数组的最大容量了说明数组满了
		return errors.New("数组满了")
	}

	//添加数据先把对尾的位置向后面移一下
	this.end++
	this.array[this.end] = val
	return nil
}

//得到数组中的一个元素数据
func (this *Queue) Get() (int, error) {
	//判断是否为空了
	if this.head == this.end {
		return -1, errors.New("数组为空了")
	}

	this.head++
	i := this.array[this.head]

	return i, nil
}

//显示队列中的内容
func (this *Queue) Show() () {
	fmt.Println("当前队列是:")
	for i := this.head + 1; i <= this.end; i++ {
		fmt.Printf("array[%d]=%d \t", i, this.array[i])
	}
	fmt.Println()
}

func main() {
	queue := new(Queue)
	queue.maxSize = 5
	queue.head = -1
	queue.end = -1

	var input string
	var val int
	for {
		fmt.Println("1,输入add添加数据到数组中")
		fmt.Println("2,输入get添从队列中获取数据")
		fmt.Println("3,输入show显示队列")
		fmt.Println("4,输入exit退出程序")
		fmt.Println("请选择输入")

		fmt.Scanln(&input)

		switch input {
		case "add":
			fmt.Println("请输入数据")
			fmt.Scanln(&val)
			err := queue.Add(val)
			if err != nil {
				fmt.Println(err.Error())
			} else {
				fmt.Println("添加数据成功")
			}
		case "get":
			v, err := queue.Get()
			if err != nil {
				fmt.Println(err.Error())
			} else {
				fmt.Printf("从队列中取出的数据是:%d\n", v)
			}
		case "show":
			queue.Show()
		case "exit":
			os.Exit(0)
		}

	}

}
